/**
 * Copyright (C) 2010-2013 Alibaba Group Holding Limited
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
package io.dts.remoting.protocol;

import java.nio.charset.Charset;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;


/**
 * 复杂对象的序列化，利用json来实现
 * 
 * @author shijia.wxr<vintage.wang@gmail.com>
 * @since 2013-7-13
 */
public abstract class RemotingSerializable {
  public String toJson() {
    return toJson(false);
  }


  public String toJson(final boolean prettyFormat) {
    return toJson(this, prettyFormat);
  }


  public static String toJson(final Object obj, boolean prettyFormat) {
    return JSON.toJSONString(obj, prettyFormat);
  }


  public static <T> T fromJson(String json, Class<T> classOfT) {
    return JSON.parseObject(json, classOfT);
  }


  public byte[] encode() {
    final String json = this.toJson();
    if (json != null) {
      return json.getBytes();
    }
    return null;
  }


  public static byte[] encode(final Object obj) {
    final String json = toJson(obj, false);
    if (json != null) {
      return json.getBytes(Charset.forName("UTF-8"));
    }
    return null;
  }

  private static final SerializerFeature[] featuresWriteClassName =
      new SerializerFeature[] {SerializerFeature.PrettyFormat, SerializerFeature.WriteClassName};


  public static byte[] encode1(final Object obj) {
    final String json = JSON.toJSONString(obj, featuresWriteClassName);
    if (json != null) {
      return json.getBytes(Charset.forName("UTF-8"));
    }
    return null;
  }

  public static <T> T decode(final byte[] data, Class<T> classOfT) {
    final String json = new String(data, Charset.forName("UTF-8"));
    return fromJson(json, classOfT);
  }
}
